const db = wx.cloud.database(); // 确保 db 在 Page 构造函数外部被定义

Page({
  data: {
    percent: 0,
    total: 0,
    isSelect: false,
    subject: null,
    userSelect: '',
    userScore: 0, // 用户得分
    totalScore: -1, // 总得分
    totalError: 0, // 用户答错了几道题
    current: 1, // 从第一题开始
    titles: [], // 新增 titles 属性
    correctCount: 0, // 新增：记录答对的题目数量
    startTime: 0, // 记录答题开始时间
    timer: null, // 定时器标识
    totalQuestionTime: 0 // 答题总时间
  },

  // 一进入页面就执行 onload
  onLoad() {
    // 初始化云开发环境
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力');
    } else {
      wx.cloud.init({
        env: 'cyd-3gggbysr2fd5af16', // 替换为你的环境 ID
        traceUser: true,
      });
    }

    this.fetchQuestions();
    this.data.startTime = Date.now();
    this.startTimer();
  },

  // 获取题目
  fetchQuestions() {
    const types = ['单选', '多选', '判断', '填空题'];
    const promises = types.map(type => {
      return db.collection('timu') // 确保 db 已经定义
        .aggregate()
        .match({
          type: type
        })
        .sample({
          size: 5
        })
        .end()
        .then(res => res.list);
    });

    Promise.all(promises)
      .then(results => {
        console.log(results);
        // 按照指定顺序合并题目
        const titles = results.flat();
        this.setData({
          subject: titles[0],
          total: titles.length,
          titles: titles, // 更新 titles 到 data 中
          correctCount: 0 // 初始化答对题目数量
        });
      })
      .catch(err => {
        console.error('获取题目失败', err);
      });
  },

  // 用户选择
  checkboxChange(e) {
    this.setData({
      userSelect: e.detail.value
    });
  },

  // 用户选择判断题
  radioChange(e) {
    this.setData({
      userSelect: e.detail.value
    });
  },

  // 用户填写填空题
  fillInChange(e) {
    this.setData({
      userSelect: e.detail.value
    });
  },

  // 提交答题并切换下一题
  submit() {
    // 获取用户选项并判空
    let userSelect = this.data.userSelect;
    if (!userSelect || userSelect.length < 1) {
      wx.showToast({
        icon: 'none',
        title: '请做选择',
      });
      return;
    }

    // 更新进度条
    let currentNum = this.data.current;
    this.setData({
      percent: ((currentNum / this.data.titles.length) * 100).toFixed(1) // 使用 this.data.titles
    });

    // 判断用户是否答对
    console.log('用户选项', userSelect);
    console.log('正确答案', this.data.subject.answer);

    let isCorrect = false;

    // 根据题目类型处理 userSelect 和 answer
    if (Array.isArray(this.data.subject.answer)) {
      // 多选题
      if (Array.isArray(userSelect)) {
        isCorrect = this.data.subject.answer.sort().toString() === userSelect.sort().toString();
      }
    } else {
      // 单选题、判断题、填空题
      if (typeof userSelect === 'string') {
        isCorrect = this.data.subject.answer === userSelect;
      } else if (Array.isArray(userSelect)) {
        // 如果 userSelect 是数组，取第一个元素进行比较
        isCorrect = this.data.subject.answer === userSelect[0];
      }
    }

    if (isCorrect) {
      // console.log('用户答对了第' + currentNum + "道题");
      this.setData({
        userScore: this.data.userScore + 1,
        correctCount: this.data.correctCount + 1 // 更新答对题目数量
      });
    } else {
      // 记录用户答错的题，方便用户查漏补缺
      let subjectNow = this.data.subject;
      subjectNow.userSelect = userSelect;

      // 将错题信息存入“users”数据库对应用户的“cuoti”字段
      const openid = wx.getStorageSync('openid'); // 获取openid
      const usersCollection = db.collection('users');
      const wrongQuestionData = {
        title: subjectNow.title,
        type: subjectNow.type,
        userAnswer: userSelect,
        correctAnswer: subjectNow.answer,
        explain: subjectNow.explain,
        timestamp: new Date().toISOString()
      };
      // 根据题型决定是否存储选项信息
      if (subjectNow.type === '单选' || subjectNow.type === '多选' || subjectNow.type === '判断') {
        wrongQuestionData.options = subjectNow.options;
      }

      usersCollection.where({
        openid: openid
      }).get().then(res => {
        if (res.data && res.data.length > 0) {
          let cuoti = res.data[0].cuoti || [];
          cuoti.push(wrongQuestionData);
          usersCollection.doc(res.data[0]._id).update({
            data: {
              cuoti: cuoti
            },
            success: res => {
              console.log('错题已成功保存到用户记录', res);
            },
            fail: err => {
              console.error('保存错题失败', err);
            }
          });
        } else {
          console.error('用户记录不存在');
          wx.showToast({
            title: '用户记录不存在',
            icon: 'none'
          });
        }
      }).catch(err => {
        console.error('查询用户记录失败', err);
      });
    }

    // console.log('一共答对了' + this.data.userScore + '道题');

    // 在最后一题进行打分
    if (currentNum >= this.data.titles.length) { // 使用 this.data.titles
      this.goToFinishPage();
      return;
    }

    // 重置 userSelect 为空数组或空字符串
    let subject = this.data.titles[currentNum]; // 使用 this.data.titles
    let newUserSelect = Array.isArray(subject.answer) ? [] : ''; // 根据新题目的类型重置 userSelect
    this.setData({
      userSelect: newUserSelect, // 根据新题目的类型重置 userSelect
      subject,
      current: currentNum + 1,
      isSelect: false,
    });
  },

  // 收藏题目
  collectQuestion() {
    const questionData = {
      questionId: this.data.current,
      title: this.data.subject.title,
      userAnswer: this.data.userSelect,
      correctAnswer: this.data.subject.answer,
      type: this.data.subject.type,
      explain: this.data.subject.explain,
      timestamp: new Date().toISOString() // 添加时间戳以便记录收藏时间
    };

    // 获取openid
    const openid = wx.getStorageSync('openid');
    const db = wx.cloud.database();
    const usersCollection = db.collection('users');

    // 查询用户记录
    usersCollection.where({
      openid: openid
    }).get().then(res => {
      if (res.data && res.data.length > 0) {
        let save = res.data[0].save || [];
        let existingQuestion = save.find(item => item.title === questionData.title);
        if (existingQuestion) {
          // 如果存在相同标题的记录，可以选择更新或提示用户
          console.log('已存在相同标题的记录', existingQuestion);
          wx.showToast({
            title: '此题目已收藏',
            icon: 'none'
          });
        } else {
          // 如果不存在相同标题的记录，则插入新记录
          save.push(questionData);
          usersCollection.doc(res.data[0]._id).update({
            data: {
              save: save
            },
            success: res => {
              console.log('题目已成功保存到用户记录', res);
              wx.showToast({
                title: '收藏成功',
                icon: 'success'
              });
            },
            fail: err => {
              console.error('保存题目失败', err);
              wx.showToast({
                title: '收藏失败',
                icon: 'none'
              });
            }
          });
        }
      } else {
        console.error('用户记录不存在');
        wx.showToast({
          title: '用户记录不存在',
          icon: 'none'
        });
      }
    }).catch(err => {
      console.error('查询用户记录失败', err);
    });
  },

  // 启动定时器，开始记录答题时间
  startTimer() {
    this.data.timer = setInterval(() => {
      let currentTime = Math.floor((Date.now() - this.data.startTime) / 1000);
      this.setData({
        totalQuestionTime: currentTime
      });
    }, 1000);
  },

  // 跳转到答题结束页面
  goToFinishPage() {
    if (this.data.timer) {
      clearInterval(this.data.timer);
      wx.navigateTo({
        url: `/pages/answer-finish/answer-finish?totalTime=${this.data.totalQuestionTime}&correctCount=${this.data.correctCount}`, // 传递答对题目数量
      });
    }
  }
});